<?php 	class Accesatabla {
		
		private $db=null, $estatabla, $esnuevo, $registro, $totaldelineas, $estalinea, $totaldecampos=0, $ultimosql='' ;
		private $cambiados = array () , $contenido = array ();
		private $tipocampo = array () , $loscampos = array ();
		//Comentarios suponiendo que los parametros ingresados sean correctos.	
		public function __construct( $esatabla ) {//Obtiene la informacion de la tabla que se envia al crear el objeto.
			
			include_once('db.php');
			$this->db = new db();
			$this->db->query('desc '.$esatabla.' ;');
			//Obtiene la cantidad total de campos en la tabla
			$this->totaldecampos = $this->db->rows();
			if($this->totaldecampos===false){
				//echo '<h1 style="background-color:#FF0000; color:#FFFF00;">Unknown Table '.$esatabla."</h1>";
			} else {
				$this->totaldecampos -- ;
				for ($i = 0; $i <= $this->totaldecampos ; $i++) {
				//Guarda la informacion de los campos y sus tipos
					$camp = $this->db->fetch();
					$this->loscampos[$i] = $camp[0];
					$this->tipocampo[$i] = $camp[1];
				}
				$this->estatabla=$esatabla ;//Guarda el nombre la tabla,
				$this->definetipos();//Guarda el tipo de datos de los campos.
				$this->limpiar();//Inicializa el contenido en 0 y indica que los campos no han recibido cambios.
			}
		}
		public function campos(){ //Regresa un arreglo con la data en los campos
			return $this->loscampos; 
		}
		public function definetipos() { //Define los tipos de datos que tiene cada campo
			for ( $i = 0; $i <= $this->totaldecampos; $i++ ) {
				$eltipo = $this->tipocampo[ $i ];
				if(stristr($eltipo,"tinyint(")===false){
					if(stristr($eltipo,"varchar(")===false){
						if(stristr($eltipo,"int(")===false){
							if(stristr($eltipo,"text")===false){
								if(stristr($eltipo,"double")===false){
									if(stristr($eltipo,"char(")===false){
										if(stristr($eltipo,"float")===false){
											if(stristr($eltipo,"date")===false){
												if(stristr($eltipo,"decimal(")===false){
													echo '<h1 style="background-color:#FF0000; color:#FFFF00;">Unknown DataType('.$i.') '.
														$eltipo." para el campo ".$this->loscampos[$i]." en la tabla ".$this->estatabla."</h1>";
												}else{
													$this->tipocampo[ $i ] = "doble";
												}
											}else{
												$this->tipocampo[ $i ] = "cadena";
											}
										}else{
											$this->tipocampo[ $i ] = "doble";
										}
									}else{
										$this->tipocampo[ $i ] = "cadena";
									}
								}else{
									$this->tipocampo[ $i ] = "doble";
								}
							}else{
								$this->tipocampo[ $i ] = "cadena";
							}
						}else{
							$this->tipocampo[ $i ] = "entero";
						}
					}else{
						$this->tipocampo[ $i ] = "cadena";
					}
				}else{
					$this->tipocampo[ $i ] = "entero";
				}
			}
		}
		public function tabla() {//Regresa el nombre la tabla
			return $this->estatabla;
		}
		public function totaldecampos() {//Regresa el total de campos
			return $this->totaldecampos;
		}
		public function renombrar( $ppk , $campo ) {//Recibe la llave primaria y el nombre del campo a buscar y devuelve el valor del campo en esa posicion.
			$j = $this->posiciondelcampo( $campo );
			if ( $j == -1 ) {
				$i = "No existe campo (".$campo.") para PK(".$ppk.")" ;
			} else {
				$i = "Llave Primaria (".$ppk.") no existe!" ;
				if ( $this->buscarprimaria($ppk) ) $i = $this->contenido[ $j ];
			}
			return $i;
		}
		public function nuevo() {//Crea un nuevo registro
			$this->limpiar(); // SI INICIA EL REGISTRO SE VUELVE NUEVO...
			$this->esnuevo = True;
			RETURN True;
		}
		public function salvar() {//Guarda los valores en un registros, regresa true si se afectaron los registros
			$syntax = "";		$valores= "";
			if ( $this->esnuevo ) {//Si el registro es nuevo...
				$valores= "  VALUES (";
				$syntax = "INSERT INTO ".$this->estatabla." (";
				for ( $i = 0; $i <= $this->totaldecampos; $i++ )
				{
					if ( $this->cambiados[ $i ] )//Si los campos fueron cambiados inserta en...
					{
						$ab=""; if ( $this->tipocampo[ $i ] == 'cadena' ) { $ab="'"; }//Separacion entre parametros
						$syntax = $syntax .      $this->loscampos[ $i ] .", ";//Campos en los que se insertara
						$valores= $valores .$ab. $this->contenido[ $i ] .$ab.", ";//Valores que se insertaran
					}
				}//Revision de la sintaxis
				$syntax  = $syntax  . ") ";
				$valores = $valores . ");";
				$syntax = str_replace( ", )", " )", $syntax );
				$valores= str_replace( ", )", " )", $valores);
				$syntax = $syntax . $valores ;//Se unen ambos argumentos para crear la sentencia sql.
			} else {//Si el registro ya existe
				$syntax = "UPDATE ".$this->estatabla." SET ";
				for ( $i = 0; $i <= $this->totaldecampos; $i++ ) {
					if ( $this->cambiados[ $i ] ) {//Si los campos fueron cambiados actualiza en...
						$ab=""; if ( $this->tipocampo[ $i ] == 'cadena' ) { $ab="'"; }//Separacion entre parametros
						$syntax = $syntax.$this->loscampos[ $i ]."=".$ab. $this->contenido[ $i ] .$ab.", ";//el campo y su valor
					}
				}
				$syntax = rtrim($syntax)." WHERE ".$this->loscampos[ 0 ]." = ". $this->contenido[ 0 ] ." ;" ;//Donde el id sea = al campo que se va a actulizar
				$syntax = str_replace( ", WHERE", " WHERE", $syntax );
			//****************************************************************************************************
			$this->ultimosql =  $syntax ;//guarda el sql
			//****************************************************************************************************
			}
			//echo $syntax;
			$this->db->query($syntax);//Realiza el query
			if ( $this->db->affected_rows() > 0 ) {//Si se afecto un registro...
				for ( $i = 0; $i <= $this->totaldecampos; $i++ ) { 
				$this->cambiados[ $i ] = False; //reiniciar la cuenta de campos cambiados
				}
				$this->esnuevo = false;
			}
			return ( $this->db->affected_rows() > 0 );//regresa true si se hizo algo
		}
		public function buscarprimaria ( $pid ) {//Recibe el valor de la llave primaria a evaluar y regresa un valor booleano indicando si el registro existe o no.
			//Si recibe id se contaran todos los registros ya que se crea la redundancia id=id.
			$this->limpiar() ;
			$this->estalinea = -1;
			$this->totaldelineas = 0;
			$syntax = "select * from ".$this->estatabla." where id=".$pid.";";
			//echo $syntax;
			$this->db->query($syntax);
			$this->totaldelineas = $this->db->rows();//Indica el numero de registros que existen con ese id.
			if ($this->totaldelineas != 0) {//Si el registro existe...
				$this->esnuevo = False;//Indica que el registro existe
				$this->registro = $this->db->fetch();//Obtiene la informacion del o de los registros
				$this->llenarcampos();//Guarda la informacion del o de los registros
				$this->estalinea = 1;
			}
			return ( $this->estalinea == 1 );
		}
		public function buscardonde ( $psyntax , $leer=1 ) {//Recibe una condicion para la seleccion de registros y regresa un valor booleano indicando si existe o no.
			$this->limpiar() ;//Reinicia los registros
			$this->estalinea = -1;
			$this->totaldelineas = 0;
			$syntax = "select * from ".$this->estatabla." where ".$psyntax." ;";
			
			//echo "<td><h1>".$syntax."</h1></td>";
						
			$this->db->query($syntax);//Realiza la busqueda de los registros que coincidan con la condicion
			$this->totaldelineas = $this->db->rows();//Guarda la cantidad de registros que coindicen con la condicion
			if ($this->totaldelineas != 0) {
				$this->esnuevo = False;//Indica que el registro existe
				$this->estalinea = 0;
				if(!empty($leer))
					$this->releer();//Guarda la informacion de los campos actualmente seleccionados
			}
			return ( $this->totaldelineas > 0 );
		}
		public function estructura() {//Regresa el nombre de los campos y tipo de campos dentro de la tabla
			$estr = $this->estatabla.":<br>";
			for($i=0; $i <= $this->totaldecampos; $i++){
				$estr = $estr ."(". $this->tipocampo[$i] .") ". $this->loscampos[$i] ."<br>" ;
			}
			return $estr;
		}
		public function releer() {//Guarda la informacion de los campos actualmente seleccionados
			$again = False;
			$this->registro = $this->db->fetch();//Guarda la informacion de los campos
			if ( $this->estalinea < $this->totaldelineas ) {
				$this->llenarcampos();
				$this->estalinea = $this->estalinea + 1 ;
				$again = True;
			}
			return $again ;
		}
		public function posiciondelcampo( $elcampo ) {//Recibe el nombre de un campo y regresa la posicion del campo dentro de la tabla, si el campo no existe regresa -1
			$posic = -1;
			//Se realiza la busqueda del campo
			for ( $i = 0; $i <= $this->totaldecampos; $i++ ) {
				if ( $this->loscampos[ $i ] == $elcampo ) { $posic = $i; }//Si lo encuentra guarda la posicion
			}
			if( $posic == -1 ) {//Sino envia un mensaje de error
				//echo '<h1 style="background-color:#FF0000; color:#FFFF00;">Desconocido campo: ('.
					//$elcampo.') dentro de los '.$this->totaldecampos.' campos de la tabla "'.
					//$this->estatabla.'"</h1>';
			}
			return ( $posic );
		}
		public function llenarcampos() {//Guarda la informacion de los campos y registros actualmente seleccionados
			$tmp = $this->esnuevo;
			$this->limpiar();
			$this->esnuevo = $tmp;
			for ( $i = 0; $i <= $this->totaldecampos; $i++ )
			{
				$tmp = $this->loscampos[ $i ];
				$this->contenido[ $i ] = $this->registro[ $tmp ];//guarda del campo o de los campos.
			}
		}
		public function limpiar() {//Reinicia el contenido de los campos.
			$this->esnuevo = True;
			for ( $i = 0; $i <= $this->totaldecampos; $i++ ) {
				$this->cambiados[ $i ] = False;
				switch ( $this->tipocampo[ $i ] ) {
					case 'cadena':
						$this->contenido[ $i ] = '';
						break;
					case 'doble':
						$this->contenido[ $i ] = 0.00;
						break;
					case 'entero':
						$this->contenido[ $i ] = 0;
						break;
					default:
						echo '<h1>Desconocido: '.$j.' pos['.$i.'] en "'.$this->estatabla.'"</h1>';
						$this->contenido[ $i ] = null;
						break;
				}
			}
		}
		public function ultimosql(){//Regresa el ultimo sql utilizado
			return $this->ultimosql ;
		}
		public function obtener($elcampo){  //Recibe el nombre del campo a evaluar y devuelve el valor en ese campo
			$j = $this->posiciondelcampo( $elcampo );
			$i = null;
			if ( $j == -1 ) {
				echo "<h1>No existe campo (".$elcampo.") en (".$this->estatabla.")</h1>" ;
			} else {
				$i = $this->contenido[ $j ];
			}
			return $i;
		}
		public function colocar(  $elcampo , $v ) {//Recibe el nombre de un campo y el valor a ser insertado
			$j = $this->posiciondelcampo( $elcampo );//Se obtiene la posicion del campo
			if ( $j == -1 ) {
				//echo "</h1>No existe campo (".$elcampo.") en la tabla (".$this->estatabla.")</h1>" ;
			} else {//Si el campo existe...
				//echo "<br>El campo ".$elcampo." existe en la posicion (".$j.") como tipo (".$this->tipocampo[ $j ].")<br>";
				if ( $v !== null ) {
					$i = $this->tipocampo[ $j ] ;//Se guarda el tipo de datos para ese campo
					switch ( $i ) {//Dependiendo del tipo de datos se realiza la insercion del valor
						case 'cadena':
							if (!is_string($v)) $v = (string) $v;
							$this->contenido[ $j ] = $v ;
							$this->cambiados[ $j ] = true ;
							break;
						case 'doble':
							$this->contenido[ $j ] = (double) $v ;
							$this->cambiados[ $j ] = true ;
							break;
						case 'entero':
							$this->contenido[ $j ] = (int) $v ;
							$this->cambiados[ $j ] = true ;
							break;
						default:
							//echo '<h1>Tipo Desconocido: '.$elcampo.' pos['.$j.'] en "'.$this->estatabla.'"</h1>';
							//$this->contenido[ $j ] = null;
							break;
					}
				} else {
					
				}
			}
		}
		public function dropdown( $var, $condic, $pkcampo, $campo1, $campo2, $inicio ) {/* Recibe el nombre de la variable, la condicion de seleccion de registros, el id ,el nombre del o de los campos que se mostraran en el drowndown y el valor a mostrar por defecto. */
			$txt = '<select name="'. $var .'"><option value=" "> </option>';//Se coloca la variable con los valores
			if( empty( $condic ) ){ $condic =' id<>0 '; }//Cero y solo cero
			if( empty( $pkcampo) ){ $pkcampo='id'; }//Campo a buscar
			$i = $this->buscardonde( $condic );//Busca los registros donde coincide la condicion
			while ( $i ) {//Mientras hayan registros...
				$prim = $this->obtener($pkcampo) ;//Guarda el contenido del campo
				$selc = '';
				if( !empty($inicio) and $prim == $inicio ){ //Se selecciona el campo por defecto
					$selc = ' selected="selected" '; 
				}
				$txt = $txt.'<option value="'. $prim .'"'.$selc.'>'.$this->obtener($campo1) ;//Se coloca la informacion del primer campo
				if( ! empty( $campo2 ) ){ //Se concatena ala informacion del segundo campo
					$txt = $txt .' '. $this->obtener($campo2) ; 
				}
				$txt = $txt . '</option>';
				$i = $this->releer();
			}
			$txt = $txt . '</select>';
			return $txt ;
		} 
		public function totalfilas(){//Regresa la cantidad de registros
		return $this->totaldelineas;
		}
		public function buscarprimaria2 ( $syntax ) {
			$this->limpiar() ;
			$this->estalinea = -1;
			$this->totaldelineas = 0;
			$syntax = "select * from ".$this->estatabla." where ".$syntax.";";
			$this->db->query($syntax);
			$this->totaldelineas = $this->db->rows();
			if ($this->totaldelineas != 0) {
				$this->esnuevo = False;
				$this->registro = $this->db->fetch();
				$this->llenarcampos();
				$this->estalinea = 1;
			}
			return ( $this->estalinea == 1 );
		}
		public function llenartabla($arr, $syntax){
			if( $syntax ){ $this->buscarprimaria2($syntax); }
			foreach ($arr as $campo => $valor){
				$this->colocar($campo, $valor);
			}
			$this->salvar();
		}
		public function obtenercampos($campo){
			$i = $this->buscardonde(1);
			$com = 0;
			$txt = '';
			while ( $i ) {
				if( $com != 0 ){ $txt = $txt . ", "; }
				$txt = $txt . '"' .$this->obtener($campo). '"';
				$i = $this->releer();
				$com = 1;
			}
			return '[' .$txt. ']';
		}
		public function obtenertabla($campo,$cid,$objj,$tb){
			$i = $this->buscardonde(1);
			$txt = '';
			while ( $i ) {
				$txt = $txt . '<tr><td>' .$this->obtener($campo). '</td><td><a id="" href="./?obj=edit&id=' . $this->obtener($cid). '&cid=' .$cid. '&campo=' .$campo. '&tb=' .$tb. '&objj=' .$objj. '&v='.$this->obtener($campo).'">Editar</a></td></tr>';
				$i = $this->releer();
			}
			return '<table>' .$txt. '</table>';
		}
		public function obtenerarreglo($campo){
			$i = $this->buscardonde(1);
			$arr=0;
			while ( $i ) {
				$arr[$i] = $this->obtener($campo);
				$i = $this->releer();
			}
			return $arr;
		}
		public function creartabla($tabla,$w){
			$arr = '';
			for($i=0; $i <= $this->totaldecampos(); $i++){
				$campos = $this->buscardonde('oculto=0');
				$j=0;
				while ( $campos ) {
					$arr[$i][$j] = $this->obtener($this->loscampos[$i]);
					$campos = $this->releer();
					$j++;
				}
			}
			if($this->totalfilas()<>0){
				if(strcmp($tabla,"potreros")==0){
					$id='potreros_idpotreros';
					$cols=2;
					$nom='';
				}
				else {
					$id='grupos_idgrupos';
					$cols=3;
					$nom='<th>Nombre</th>';
				}
				if($w==-2) {
					$form='';
				}
				else {
					$form='<form action="" method="POST">';
				}
				echo	'<table>
						<tr>
							<th class="chk"></th>
							<th class="chkb"></th>
							<th>Código</th>
							'.$nom.'
							<th>Descripción</th>
						</tr>';
				for($z=0; $z<=$this->totalfilas()-1;$z++){
					if($w==$arr[0][$z]){
						$w=$z;
					}
				}
				for($y=0; $y < $j; $y++){
					echo $form.'<tr>
							<td class="chk"><input type="radio" name="'.$id.'" value="'.$arr[0][$y].'"/></td>';
					for($x=0; $x <= $cols; $x++){
						if($y==$w){
							if($this->loscampos[$x]=='descripcion'){
								echo '<td><textarea cols="30" rows="1" name="'.$this->loscampos[$x].'" >'.$arr[$x][$y].'</textarea></td>';
							}
							else{
								if($x==0){
									echo '<td class="chkb"><input type="text" value="'.$arr[$x][$y].'" name="'.$this->loscampos[$x].'"/></td>';
								}
								else{
									echo '<td><input type="text" value="'.$arr[$x][$y].'" name="'.$this->loscampos[$x].'"/></td>';
								}
							}
						}
						else{
							if($x==0){
								echo '<td class="chkb"><input type="text" value="'.$arr[$x][$y].'" name="'.$this->loscampos[$x].'"/></td>';
							}
							else{
								echo '<td>'.$arr[$x][$y].'</td>';
							}
						}
					}
					if($y==$w){
						echo '<td class="chka"><input type="submit" class="btn" value="Aceptar" name="Aceptar"/></td>
								<td class="chka"><input type="submit" name="cancelar" value="Cancelar"/></td>
								</tr></form>';
					}
					else{
						echo '<td class="chka"><input type="submit" class="btn" value="Editar" name="Editar"></td>
								<td class="chka"><input type="submit" name="Eliminar" value="Eliminar"/></td>
								</tr></form>';
					}
				}
					echo '</table>';
			}
		}
		
		public function creartabla_clipro($w){
			$tabla='cliente_proveedores';
			$arr = '';
			for($i=0; $i <= $this->totaldecampos(); $i++){
				$campos = $this->buscardonde("status=''");
				$j=0;
				while ( $campos ) {
					$arr[$i][$j] = $this->obtener($this->loscampos[$i]);
					$campos = $this->releer();
					$j++;
				}
			}
			if($this->totalfilas()<>0){
				echo	'<table>
						<tr>
							<th class="chkb"></th>
							<th>Categoria</th>
							<th>Nombre</th>
							<th>DV</th>
							<th>RUC</th>
							<th>Dirección</th>
							<th>Teléfono</th>
							<th>Celular</th>
							<th>E-mail</th>
						</tr>';
				for($z=0; $z<=$this->totalfilas()-1;$z++){
					if($w==$arr[0][$z]){
						$w=$z;
					}
				}
				for($y=0; $y < $j; $y++){
					echo '<form action="" method="POST"><tr>';
					for($x=0; $x <= 8; $x++){
						if($y==$w){
							
								if($x==0){
									echo '<td class="chkb"><input type="text" value="'.$arr[$x][$y].'" name="'.$this->loscampos[$x].'"/></td>';
								}
								else{
									echo '<td><input type="text" value="'.$arr[$x][$y].'" name="'.$this->loscampos[$x].'"/></td>';
								}
							
						}
						else{
							if($x==0){
								echo '<td class="chkb"><input type="text" value="'.$arr[$x][$y].'" name="'.$this->loscampos[$x].'"/></td>';
							}
							else{
								echo '<td>'.$arr[$x][$y].'</td>';
							}
						}
					}
					if($y==$w){
						echo '<td class="chka"><input type="submit" class="btn" value="Aceptar" name="Aceptar"/></td>
								<td class="chka"><input type="submit" name="cancelar" value="Cancelar"/></td>
								</tr></form>';
					}
					else{
						echo '<td class="chka"><input type="submit" class="btn" value="Editar" name="Editar"></td>
								<td class="chka"><input type="submit" name="Eliminar" value="Eliminar"/></td>
								</tr></form>';
					}
				}
					echo '</table>';
			}
		}
		
		public function update($arr,$syntax){
			if( $syntax ){ $this->buscarprimaria2($syntax); }
			foreach ($arr as $campo => $valor){
				$this->colocar($campo, $valor);
			}
			$this->salvar();
		}
		public function eliminar($syntax){
			$qeliminar="UPDATE ".$this->estatabla." SET oculto=1 WHERE ".$syntax; 
			$this->ultimosql =  $qeliminar;
			$this->db->query($qeliminar);
		}
		
		public function eliminar_clipro($syntax){
			$qeliminar="UPDATE ".$this->estatabla." SET status=1 WHERE ".$syntax; 
			$this->ultimosql =  $qeliminar;
			$this->db->query($qeliminar);
		}
		
}
?>
